package com.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class question {
    public static void main(String[] args) throws ClassNotFoundException {
        Cat cat = new Cat();
        System.out.println(cat.hi());

        //反射机制解决，调用
        //1.加载类 返回Class类型的对象
        String classfullpath = "com.reflection.Cat";
        Class cls = Class.forName(classfullpath);
        //2.通过cls得到你加载的类com.reflection.Cat的对象实例

        try {/*当前包名为reflect，必须使用全路径*/
            Object o = (Cat) cls.newInstance();
            System.out.println(o.getClass());
            //3.通过cls得到你加载类com.reflection.Cat的methodName"hi"的方法对
            Method method1 = cls.getMethod("hi");
            System.out.println(method1.invoke(o));

            //getField 不能得到私有的属性
            Field name_f = cls.getField("age");
            //传统写法 对象.成员变量
            //反射：成员变量对象.get(对象)
            System.out.println(name_f.get(o));

            //构造器
            Constructor constructor = cls.getConstructor();
            System.out.println(constructor);


        } catch (Exception e) {
            System.out.println("通过Class.NewInstance()调用私有构造函数【失败】");
        }

    }
}
